﻿using OCG;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

// Listkov Substitution fout
namespace LSF
{
    class Enquiry : Customer
    {
        public override double getDiscount(double TotalSales)
        {
            return base.getDiscount(TotalSales) - 5;
        }

        public override void Add()
        {
            throw new Exception("Not allowed");
        }
    }

    class Main {
        
        /// <summary>
        /// Gaat niet goed omdat Enquiry een exception geeft wanneer de add wordt aageroepen.
        /// Dit betekent dat Enquiry geen echte costumer is aangezien het niet hetzelfde doel heeft.
        /// hierdoor is het niet vervangbaar door al zijn subtypes.
        /// </summary>
        public void Run() {
            List<Customer> Customers = new List<Customer>();
            Customers.Add(new SilverCustomer());
            Customers.Add(new goldCustomer());
            Customers.Add(new Enquiry());

             foreach (Customer o in Customers)
             {
                o.Add();
             }
        }

    }
}

// Listkov Substitution goed
namespace LSG
{
    /// <summary>
    /// Er worden twee interfaces gemaakt, 1 voor Discount en 1 voor database.
    /// De enquiry doet niets met de database dus hij wordt ook niet gekoppeld aan IDatabase
    /// </summary>
    interface IDiscount
    {
        double getDiscount(double TotalSales);
    }

    interface IDatabase
    {
        void Add();
    }

    class Enquiry : IDiscount
    {
        public double getDiscount(double TotalSales)
        {
            return TotalSales - 5;
        }
    }

    class Customer : IDiscount, IDatabase
    {
        public virtual void Add()
        {
            try
            {
                // Database code goes here
            }
            catch (Exception ex)
            {
            }
        }

        public virtual double getDiscount(double TotalSales)
        {
            return TotalSales;
        }
    }

    class SilverCustomer : Customer
    {
        public override double getDiscount(double TotalSales)
        {
            return base.getDiscount(TotalSales) - 50;
        }

        public override void Add()
        {
            base.Add();
        }
    }

    class goldCustomer : Customer
    {
        public override double getDiscount(double TotalSales)
        {
            return base.getDiscount(TotalSales) - 100;
        }

        public override void Add()
        {
            base.Add();
        }
    }

    class Main
    {
        public void Run()
        {
            List<IDatabase> Customers = new List<IDatabase>();
            Customers.Add(new SilverCustomer());
            Customers.Add(new goldCustomer());
            // Dit kan niet omdat enquiry geen relatie meer heeft met IDatabase.
            Customers.Add(new Enquiry());

            foreach (Customer o in Customers)
            {
                o.Add();
            }
        }
    }
}